﻿using System;
using System.Collections.Generic;
using System.Data;
using Atendex.Dominio;
using Atendex.Infraestrutura;
using Atendex.Infraestrutura.Repositórios;
using System.Collections;
using Atendex.Containex;
using System.Linq;
using System.Web.UI.WebControls;
using Atendex.Web.AppCode;

namespace Atendex.Web
{
    public partial class CadastrarAtendimento : System.Web.UI.Page
    {
        private RepositorioAtendente repAtendente = new RepositorioAtendente();
        private IAtendimento AtendimentoAtual
        {
            get { return (IAtendimento)ViewState["atendimento"]; }
            set { ViewState["atendimento"] = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                CarregarTipoSolicitacoes();
                IAtendente atendente = AtendexContext.AtendenteAtual(this);
                if (atendente == null)
                {
                    this.pnlCadastro.Visible = false;
                    MostrarMensagem("Você deve fazer o login antes de cadastrar um Atendimento.");
                }
                else
                {
                    AtendimentoAtual = Container.CriarAtendimento(atendente);
                }
            }
            else
            {
                lblMessage.Visible = false;
            }
        }

        private void CarregarTipoSolicitacoes()
        {
            ITipoSolicitacao[] tipoSolicitacoes = new RepositorioTipoSolicitacao().ObtemTodos();

            foreach (ITipoSolicitacao item in tipoSolicitacoes)
            {
                ddlTipoSolicitacao.Items.Add(new ListItem(item.Nome, item.Id.ToString()));
            }
        }

        public DataTable SolicitacoesDT
        {
            get
            {
                var dt = Session["SolicitacoesDT"] as DataTable;
                if (dt == null)
                {
                    dt = new DataTable();

                    dt.Columns.Add(new DataColumn("Tipo"));
                    dt.Columns.Add(new DataColumn("Descricao")
                                       {
                                           ColumnMapping = MappingType.Hidden
                                       });
                    dt.Columns.Add(new DataColumn("Prazo", typeof(DateTime)));
                    Session["SolicitacoesDT"] = dt;
                }
                return dt;
            }
            set
            {
                Session["SolicitacoesDT"] = value;
            }
        }

        protected void btnAddSolicitacao_Click(object sender, EventArgs e)
        {
            IMensagem mensagem = Container.CriarMensagem(txtMensagem.Text);
            mensagem.EmailAutor = String.Empty;

            ISolicitacao solicitacao = Container.CriarSolicitacao(
                this.AtendimentoAtual,
                new RepositorioTipoSolicitacao().ObtemPorId(ddlTipoSolicitacao.SelectedValue),
                mensagem);
            solicitacao.DataInicio = DateTime.Now;
            solicitacao.DataPrazo = calPrazo.SelectedDate;

            IAtendimento atendimento = AtendimentoAtual;

            atendimento.Solicitacoes.Add(solicitacao);

            DataTable table = SolicitacoesDT;

            DataRow row = table.NewRow();
            row["Tipo"] = ddlTipoSolicitacao.Text;
            row["Prazo"] = calPrazo.SelectedDate;
            row["Descricao"] = txtMensagem.Text;

            table.Rows.Add(row);

            grvSolicitacoes.DataSource = table;
            grvSolicitacoes.DataBind();
        }

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            try
            {
                IAtendimento atendimento = AtendimentoAtual;
                atendimento.Requerente = Container.CriarRequerente(txtNomeRequerente.Text,
                    ddlMeioAtendimento.SelectedValue);
                atendimento.Requerente.TipoRequerente = ddlTipoRequerente.SelectedValue;
                atendimento.Requerente.Telefone = txtTelefone.Text;
                atendimento.Requerente.Email = txtEmail.Text;
                atendimento.DataInicio = DateTime.Now;
                atendimento.DataFim = DateTime.Now;

                new RepositorioAtendimento().Salvar(atendimento);
                MostrarMensagem("Cadastro com sucesso.");
            }
            catch (Exception ex)
            {
                MostrarMensagem(ex.Message);
            }
        }
        protected void grvSolicitacoes_RowDeleting(object sender, System.Web.UI.WebControls.GridViewDeleteEventArgs e)
        {
            SolicitacoesDT.Rows.RemoveAt(e.RowIndex);

            grvSolicitacoes.DataSource = SolicitacoesDT;
            grvSolicitacoes.DataBind();
        }

        protected void grvSolicitacoes_RowEditing(object sender, System.Web.UI.WebControls.GridViewEditEventArgs e)
        {
            IAtendimento atendimento = AtendimentoAtual;
            atendimento.Solicitacoes.RemoveAt(e.NewEditIndex);

            var table = SolicitacoesDT;
            var row = table.Rows[e.NewEditIndex];

            ddlTipoSolicitacao.SelectedItem.Selected = false;
            ddlTipoSolicitacao.Items
                .FindByValue(row["Tipo"].ToString())
                .Selected = true;

            txtMensagem.Text = row["Descricao"].ToString();
            calPrazo.SelectedDate = (DateTime)row["Prazo"];

            table.Rows.RemoveAt(e.NewEditIndex);

            grvSolicitacoes.DataSource = table;
            grvSolicitacoes.DataBind();
        }


        protected void MostrarMensagem(string mensagem)
        {
            lblMessage.Text = mensagem;
            lblMessage.Visible = true;

        }

    }
}
